{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "aleatoric_regression.ipynb",
      "version": "0.3.2",
      "provenance": [],
      "include_colab_link": true
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.3"
    },
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/mlelarge/dataflowr/blob/master/CEA_EDF_INRIA/aleatoric_regression_colab.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "xnj4XU2aE2kO",
        "colab_type": "text"
      },
      "source": [
        "# Aleatoric regression"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "OaOS9uR1E2kR",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "%matplotlib inline\n",
        "\n",
        "import numpy as np\n",
        "import torch\n",
        "import math\n",
        "import matplotlib.pyplot as plt\n",
        "import imageio\n",
        "\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.nn.functional as F\n",
        "import torch.optim as optim\n",
        "from torchvision import datasets, transforms\n",
        "from torchvision.utils import make_grid\n",
        "from tqdm import tqdm, trange\n",
        "\n",
        "import seaborn as sns\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2IaBfC4dE2kV",
        "colab_type": "text"
      },
      "source": [
        "## Helper functions"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "TxRREopXE2kV",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def normalize(image):\n",
        "    \"\"\"Takes a tensor of 3 dimensions (height, width, colors) and normalizes it's values\n",
        "    to be between 0 and 1 so it's suitable for displaying as an image.\"\"\"\n",
        "    image = image.astype(np.float32)\n",
        "    return (image - image.min()) / (image.max() - image.min() + 1e-5)\n",
        "\n",
        "\n",
        "def display_images(images, titles=None, cols=5, interpolation=None, cmap=\"Greys_r\"):\n",
        "    \"\"\"\n",
        "    images: A list of images. I can be either:\n",
        "        - A list of Numpy arrays. Each array represents an image.\n",
        "        - A list of lists of Numpy arrays. In this case, the images in\n",
        "          the inner lists are concatentated to make one image.\n",
        "    \"\"\"\n",
        "    titles = titles or [\"\"] * len(images)\n",
        "    rows = math.ceil(len(images) / cols)\n",
        "    height_ratio = 1.2 * (rows/cols) * (0.5 if type(images[0]) is not np.ndarray else 1)\n",
        "    plt.figure(figsize=(15, 15 * height_ratio), dpi=200)\n",
        "    i = 1\n",
        "    for image, title in zip(images, titles):\n",
        "        plt.subplot(rows, cols, i)\n",
        "        plt.axis(\"off\")\n",
        "        # Is image a list? If so, merge them into one image.\n",
        "        if type(image) is not np.ndarray:\n",
        "            image = [normalize(g) for g in image]\n",
        "            image = np.concatenate(image, axis=1)\n",
        "        else:\n",
        "            image = normalize(image)\n",
        "        plt.title(title, fontsize=12)\n",
        "        plt.imshow(image, cmap=cmap, interpolation=interpolation)\n",
        "        i += 1\n",
        "\n",
        "        \n",
        "def show(img,cmap='viridis'):\n",
        "    npimg = img.numpy()\n",
        "    plt.imshow(np.transpose(npimg, (1,2,0)), interpolation='nearest', cmap=cmap)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "RT43ZKLoE2kZ",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def uncertainity_estimate_2d(X, model, iters, l2, dropout_p=0.5, decay=1e-6):\n",
        "    outputs = [model(X).cpu().data for i in range(iters)]\n",
        "    outputs = torch.stack(outputs)\n",
        "    y_mean = outputs.mean(dim=0)\n",
        "    y_variance = outputs.var(dim=0)\n",
        "    tau = l2 * (1. - dropout_p) / (2. * iters * decay)\n",
        "    y_variance += (1. / tau)\n",
        "    y_std = np.sqrt(y_variance)\n",
        "    return y_mean, y_std\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "QQ36HKsSE2kc",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "DEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
        "LOADER_KWARGS = {'num_workers': 1, 'pin_memory': True} if torch.cuda.is_available() else {}"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "eN6LHpaqE2ke",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "BATCH_SIZE = 128\n",
        "TEST_BATCH_SIZE = 5\n",
        "\n",
        "train_loader = torch.utils.data.DataLoader(\n",
        "    datasets.MNIST(\n",
        "        './mnist', train=True, download=True,\n",
        "        transform=transforms.ToTensor()),\n",
        "    batch_size=BATCH_SIZE, shuffle=True, **LOADER_KWARGS)\n",
        "test_loader = torch.utils.data.DataLoader(\n",
        "    datasets.MNIST(\n",
        "        './mnist', train=False, download=True,\n",
        "        transform=transforms.ToTensor()),\n",
        "    batch_size=TEST_BATCH_SIZE, shuffle=False, **LOADER_KWARGS)\n",
        "\n",
        "\n",
        "TRAIN_SIZE = len(train_loader.dataset)\n",
        "TEST_SIZE = len(test_loader.dataset)\n",
        "NUM_BATCHES = len(train_loader)\n",
        "NUM_TEST_BATCHES = len(test_loader)\n",
        "\n",
        "CLASSES = 10\n",
        "TRAIN_EPOCHS = 10 #20\n",
        "SAMPLES = 2\n",
        "TEST_SAMPLES = 10"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "lwkLkCbxE2kh",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "class AutoEncoderAleatoric(nn.Module):\n",
        "    def __init__(self, p=0.5):\n",
        "        self.dropout_p = p\n",
        "        super(AutoEncoderAleatoric, self).__init__()\n",
        "        self.encoder = nn.Sequential(\n",
        "            nn.Linear(28 * 28, 128),\n",
        "            nn.ReLU(True),\n",
        "            nn.Linear(128, 64),\n",
        "            nn.ReLU(True), \n",
        "            nn.Linear(64, 12), \n",
        "            nn.ReLU(True), \n",
        "            nn.Linear(12, 3))\n",
        "        \n",
        "        self.decoder = nn.Sequential(\n",
        "            nn.Linear(3, 12),\n",
        "            nn.ReLU(True),\n",
        "            nn.Dropout(p=self.dropout_p),\n",
        "            nn.Linear(12, 64),\n",
        "            nn.ReLU(True),\n",
        "            nn.Dropout(p=self.dropout_p),\n",
        "            nn.Linear(64, 128),\n",
        "            nn.ReLU(True), \n",
        "            nn.Dropout(p=self.dropout_p),\n",
        "            nn.Linear(128, 128), \n",
        "            nn.Tanh())\n",
        "        \n",
        "        self.fc_pred =  nn.Linear(128, 28 * 28)\n",
        "        self.fc_logvar =  nn.Linear(128, 28 * 28)\n",
        "\n",
        "\n",
        "    def forward(self, x):\n",
        "        x = x.view(-1, 28*28)\n",
        "        x = self.encoder(x)\n",
        "        x = self.decoder(x)\n",
        "        pred = torch.tanh(self.fc_pred(x))\n",
        "        logvar = F.softplus(self.fc_logvar(x))\n",
        "        return pred, logvar\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bSDp6emIE2kk",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "model = AutoEncoderAleatoric(p=0.1).to(DEVICE)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "6cFcZu3FE2kn",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def gaussian_log_loss(output, target, logvar):\n",
        "    term1 = -0.5*torch.exp(-logvar)*(target - output)**2\n",
        "    term2 = 0.5*logvar\n",
        "    return (term1 + term2).sum()\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "hz3Oi_sfE2kp",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def train_autoencoder(model, optimizer, criterion, epoch):\n",
        "    model.train()\n",
        "    for batch_idx, (data, target) in enumerate(tqdm(train_loader)):\n",
        "#     for batch_idx, (data, target) in enumerate(train_loader):\n",
        "        data = data.view(data.size(0), -1)\n",
        "        data, target = data.to(DEVICE), target.to(DEVICE)\n",
        "        model.zero_grad()\n",
        "        out, logvar = model(data)\n",
        "        loss = criterion(out, data, logvar)\n",
        "        loss.backward()\n",
        "        optimizer.step()\n",
        "     \n",
        "    print('epoch [{}], loss:{:.4f}'.format(epoch, loss.data.item()))\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "rcBrm00qE2ku",
        "colab_type": "code",
        "colab": {},
        "outputId": "962d2808-90b2-4391-875d-974f97f6291c"
      },
      "source": [
        "TRAIN_EPOCHS = 5 #20\n",
        "criterion = gaussian_log_loss\n",
        "optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)\n",
        "\n",
        "for epoch in range(TRAIN_EPOCHS):\n",
        "    train_autoencoder(model, optimizer, criterion, epoch)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  0%|          | 0/469 [00:00<?, ?it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  0%|          | 1/469 [00:00<02:45,  2.82it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "torch.Size([128, 784]) torch.Size([128, 784])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  0%|          | 2/469 [00:00<02:22,  3.28it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  1%|          | 5/469 [00:00<01:48,  4.28it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  1%|▏         | 6/469 [00:00<01:42,  4.52it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  2%|▏         | 8/469 [00:01<01:25,  5.40it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  2%|▏         | 10/469 [00:01<01:13,  6.26it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  2%|▏         | 11/469 [00:01<01:19,  5.79it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  3%|▎         | 12/469 [00:01<01:09,  6.59it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  3%|▎         | 14/469 [00:01<01:08,  6.68it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "torch.Size([128, 784]) torch.Size([128, 784])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  3%|▎         | 15/469 [00:02<01:41,  4.49it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  3%|▎         | 16/469 [00:02<01:25,  5.31it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  4%|▍         | 18/469 [00:02<01:25,  5.25it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  4%|▍         | 20/469 [00:03<01:14,  6.04it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  4%|▍         | 21/469 [00:03<01:19,  5.64it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  5%|▍         | 22/469 [00:03<01:08,  6.49it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  5%|▌         | 24/469 [00:03<01:07,  6.64it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  5%|▌         | 25/469 [00:03<01:04,  6.89it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "torch.Size([128, 784]) torch.Size([128, 784])\n",
            "torch.Size([128, 784]) torch.Size([128, 784])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "  6%|▌         | 26/469 [00:04<01:09,  6.33it/s]\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "torch.Size([128, 784]) torch.Size([128, 784])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "error",
          "ename": "KeyboardInterrupt",
          "evalue": "",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
            "\u001b[0;32m<ipython-input-70-c8ec0ebc1270>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mepoch\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mTRAIN_EPOCHS\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m     \u001b[0mtrain_autoencoder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mepoch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
            "\u001b[0;32m<ipython-input-69-3e25d229869d>\u001b[0m in \u001b[0;36mtrain_autoencoder\u001b[0;34m(model, optimizer, criterion, epoch)\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mtrain_autoencoder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mepoch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      2\u001b[0m     \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m     \u001b[0;32mfor\u001b[0m \u001b[0mbatch_idx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtarget\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtqdm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain_loader\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      4\u001b[0m \u001b[0;31m#     for batch_idx, (data, target) in enumerate(train_loader):\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m         \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mview\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m~/miniconda/lib/python3.7/site-packages/tqdm/_tqdm.py\u001b[0m in \u001b[0;36m__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m   1003\u001b[0m                 \"\"\"), fp_write=getattr(self.fp, 'write', sys.stderr.write))\n\u001b[1;32m   1004\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1005\u001b[0;31m             \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1006\u001b[0m                 \u001b[0;32myield\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1007\u001b[0m                 \u001b[0;31m# Update and possibly print the progressbar.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m~/miniconda/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    574\u001b[0m         \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    575\u001b[0m             \u001b[0;32massert\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshutdown\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbatches_outstanding\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 576\u001b[0;31m             \u001b[0midx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_batch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    577\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbatches_outstanding\u001b[0m \u001b[0;34m-=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    578\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0midx\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrcvd_idx\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m~/miniconda/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_get_batch\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    541\u001b[0m         \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpin_memory\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    542\u001b[0m             \u001b[0;32mwhile\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpin_memory_thread\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_alive\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 543\u001b[0;31m                 \u001b[0msuccess\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_try_get_batch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    544\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0msuccess\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    545\u001b[0m                     \u001b[0;32mreturn\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m~/miniconda/lib/python3.7/site-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_try_get_batch\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    509\u001b[0m         \u001b[0;31m#   (bool: whether successfully get data, any: data if successful else None)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    510\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 511\u001b[0;31m             \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata_queue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    512\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    513\u001b[0m         \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m~/miniconda/lib/python3.7/queue.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, block, timeout)\u001b[0m\n\u001b[1;32m    177\u001b[0m                     \u001b[0;32mif\u001b[0m \u001b[0mremaining\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0;36m0.0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    178\u001b[0m                         \u001b[0;32mraise\u001b[0m \u001b[0mEmpty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 179\u001b[0;31m                     \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnot_empty\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mremaining\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    180\u001b[0m             \u001b[0mitem\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    181\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnot_full\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnotify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m~/miniconda/lib/python3.7/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    298\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    299\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 300\u001b[0;31m                     \u001b[0mgotit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    301\u001b[0m                 \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    302\u001b[0m                     \u001b[0mgotit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "FW7VCCtEE2k0",
        "colab_type": "code",
        "colab": {},
        "outputId": "695895ce-1ebc-4932-9573-6a1da3da5420"
      },
      "source": [
        "mnist_sample, mnist_target = iter(test_loader).next()\n",
        "mnist_sample = mnist_sample.to(DEVICE)\n",
        "print(mnist_target)\n",
        "# sns.set_style(\"dark\")\n",
        "show(make_grid(mnist_sample.cpu()))"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "tensor([7, 2, 1, 0, 4])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "Traceback (most recent call last):\n",
            "  File \"/home/docker_user/miniconda/lib/python3.7/multiprocessing/queues.py\", line 242, in _feed\n",
            "    send_bytes(obj)\n",
            "  File \"/home/docker_user/miniconda/lib/python3.7/multiprocessing/connection.py\", line 200, in send_bytes\n",
            "    self._send_bytes(m[offset:offset + size])\n",
            "  File \"/home/docker_user/miniconda/lib/python3.7/multiprocessing/connection.py\", line 404, in _send_bytes\n",
            "    self._send(header + buf)\n",
            "  File \"/home/docker_user/miniconda/lib/python3.7/multiprocessing/connection.py\", line 368, in _send\n",
            "    n = write(self._handle, buf)\n",
            "BrokenPipeError: [Errno 32] Broken pipe\n",
            "Exception in thread QueueFeederThread:\n",
            "Traceback (most recent call last):\n",
            "  File \"/home/docker_user/miniconda/lib/python3.7/multiprocessing/queues.py\", line 232, in _feed\n",
            "    close()\n",
            "  File \"/home/docker_user/miniconda/lib/python3.7/multiprocessing/connection.py\", line 177, in close\n",
            "    self._close()\n",
            "  File \"/home/docker_user/miniconda/lib/python3.7/multiprocessing/connection.py\", line 361, in _close\n",
            "    _close(self._handle)\n",
            "OSError: [Errno 9] Bad file descriptor\n",
            "\n",
            "During handling of the above exception, another exception occurred:\n",
            "\n",
            "Traceback (most recent call last):\n",
            "  File \"/home/docker_user/miniconda/lib/python3.7/threading.py\", line 917, in _bootstrap_inner\n",
            "    self.run()\n",
            "  File \"/home/docker_user/miniconda/lib/python3.7/threading.py\", line 865, in run\n",
            "    self._target(*self._args, **self._kwargs)\n",
            "  File \"/home/docker_user/miniconda/lib/python3.7/multiprocessing/queues.py\", line 263, in _feed\n",
            "    queue_sem.release()\n",
            "ValueError: semaphore or lock released too many times\n",
            "\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ydLgSyrOE2k4",
        "colab_type": "code",
        "colab": {},
        "outputId": "e85dce15-6ad8-495a-f46e-cd64c34c8c3e"
      },
      "source": [
        "out, logvar = model(mnist_sample)\n",
        "out = out.detach().cpu()\n",
        "out = out.view(-1, 1, 28,28)\n",
        "logvar = logvar.detach().cpu()\n",
        "logvar = logvar.view(-1, 1, 28,28)\n",
        "print(out.size())\n",
        "show(make_grid(out))"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "torch.Size([5, 784]) torch.Size([5, 784])\n",
            "torch.Size([5, 1, 28, 28])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "sQIvMh1uE2k7",
        "colab_type": "code",
        "colab": {},
        "outputId": "c04271e3-15ad-4746-bf2e-821594aeb395"
      },
      "source": [
        "x = mnist_sample[1,:,:,:]\n",
        "y_mean, y_std = out[1,:,:,:], torch.exp(logvar[1,:,:,:])\n",
        "\n",
        "res_list = [x.cpu().view(28,28).numpy(), y_mean.view(28,28).numpy(), y_std.view(28,28).numpy()]\n",
        "print(res_list[0].shape)\n",
        "display_images(res_list, titles=['input','mean', 'std'], cols=len(res_list), interpolation=None, cmap=\"viridis\")"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "(28, 28)\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 3000x1200 with 3 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "pYMhCjywE2k-",
        "colab_type": "text"
      },
      "source": [
        "## Out of domain samples"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4FD2Ynb0E2k_",
        "colab_type": "code",
        "colab": {},
        "outputId": "422ca501-e572-4043-8c61-debd31698454"
      },
      "source": [
        "kmnist_loader = torch.utils.data.DataLoader(\n",
        "    datasets.KMNIST('./kmnist', train=False, download=True, transform=transforms.ToTensor()), batch_size=5, shuffle=False)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "\n",
            "0it [00:00, ?it/s]\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "Downloading http://codh.rois.ac.jp/kmnist/dataset/kmnist/train-images-idx3-ubyte.gz to ./kmnist/KMNIST/raw/train-images-idx3-ubyte.gz\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "  0%|          | 0/18165135 [00:00<?, ?it/s]\u001b[A\n",
            "  0%|          | 16384/18165135 [00:01<04:36, 65702.80it/s]\u001b[A\n",
            "  0%|          | 40960/18165135 [00:01<04:08, 72853.06it/s]\u001b[A\n",
            "  1%|          | 98304/18165135 [00:01<03:17, 91550.08it/s]\u001b[A\n",
            "  1%|          | 204800/18165135 [00:01<02:30, 119660.40it/s]\u001b[A\n",
            "  2%|▏         | 352256/18165135 [00:02<01:53, 157188.28it/s]\u001b[A\n",
            "  3%|▎         | 516096/18165135 [00:02<01:26, 203481.02it/s]\u001b[A\n",
            "  4%|▎         | 671744/18165135 [00:02<01:08, 254864.68it/s]\u001b[A\n",
            "  5%|▍         | 835584/18165135 [00:02<00:55, 311823.28it/s]\u001b[A\n",
            "  6%|▌         | 999424/18165135 [00:03<00:46, 369431.14it/s]\u001b[A\n",
            "  6%|▋         | 1155072/18165135 [00:03<00:40, 420994.49it/s]\u001b[A\n",
            "  7%|▋         | 1318912/18165135 [00:03<00:35, 470600.93it/s]\u001b[A\n",
            "  8%|▊         | 1482752/18165135 [00:03<00:32, 513085.19it/s]\u001b[A\n",
            "  9%|▉         | 1646592/18165135 [00:04<00:30, 547737.61it/s]\u001b[A\n",
            " 10%|▉         | 1802240/18165135 [00:04<00:28, 568781.45it/s]\u001b[A\n",
            " 11%|█         | 1966080/18165135 [00:04<00:27, 590994.71it/s]\u001b[A\n",
            " 12%|█▏        | 2129920/18165135 [00:04<00:26, 607556.69it/s]\u001b[A\n",
            " 13%|█▎        | 2285568/18165135 [00:05<00:25, 612713.85it/s]\u001b[A\n",
            " 13%|█▎        | 2449408/18165135 [00:05<00:25, 623702.51it/s]\u001b[A\n",
            " 14%|█▍        | 2613248/18165135 [00:05<00:24, 630741.42it/s]\u001b[A\n",
            " 15%|█▌        | 2768896/18165135 [00:05<00:24, 627085.52it/s]\u001b[A\n",
            " 16%|█▌        | 2932736/18165135 [00:06<00:24, 634105.22it/s]\u001b[A\n",
            " 17%|█▋        | 3096576/18165135 [00:06<00:23, 639302.15it/s]\u001b[A\n",
            " 18%|█▊        | 3260416/18165135 [00:06<00:23, 641187.91it/s]\u001b[A\n",
            " 19%|█▉        | 3416064/18165135 [00:06<00:23, 637009.28it/s]\u001b[A\n",
            " 20%|█▉        | 3579904/18165135 [00:07<00:22, 641142.53it/s]\u001b[A\n",
            " 21%|██        | 3743744/18165135 [00:07<00:22, 642940.91it/s]\u001b[A\n",
            " 21%|██▏       | 3899392/18165135 [00:07<00:22, 637765.84it/s]\u001b[A\n",
            " 22%|██▏       | 4063232/18165135 [00:07<00:21, 641502.72it/s]\u001b[A\n",
            " 23%|██▎       | 4227072/18165135 [00:08<00:21, 643270.46it/s]\u001b[A\n",
            " 24%|██▍       | 4390912/18165135 [00:08<00:21, 645385.67it/s]\u001b[A\n",
            " 25%|██▌       | 4546560/18165135 [00:08<00:21, 639528.96it/s]\u001b[A\n",
            " 26%|██▌       | 4710400/18165135 [00:08<00:20, 643071.59it/s]\u001b[A\n",
            " 27%|██▋       | 4874240/18165135 [00:09<00:20, 643895.91it/s]\u001b[A\n",
            " 28%|██▊       | 5029888/18165135 [00:09<00:20, 639070.91it/s]\u001b[A\n",
            " 29%|██▊       | 5193728/18165135 [00:09<00:20, 642334.21it/s]\u001b[A\n",
            " 29%|██▉       | 5357568/18165135 [00:09<00:19, 643426.14it/s]\u001b[A\n",
            " 30%|███       | 5513216/18165135 [00:10<00:19, 638420.09it/s]\u001b[A\n",
            " 31%|███▏      | 5677056/18165135 [00:10<00:19, 642151.85it/s]\u001b[A\n",
            " 32%|███▏      | 5840896/18165135 [00:10<00:19, 645084.49it/s]\u001b[A\n",
            " 33%|███▎      | 6004736/18165135 [00:10<00:18, 644882.48it/s]\u001b[A\n",
            " 34%|███▍      | 6160384/18165135 [00:11<00:18, 638067.50it/s]\u001b[A\n",
            " 35%|███▍      | 6324224/18165135 [00:11<00:18, 641525.48it/s]\u001b[A\n",
            " 36%|███▌      | 6488064/18165135 [00:11<00:18, 644735.51it/s]\u001b[A\n",
            " 37%|███▋      | 6643712/18165135 [00:11<00:18, 637499.54it/s]\u001b[A\n",
            " 37%|███▋      | 6807552/18165135 [00:12<00:17, 641442.51it/s]\u001b[A\n",
            " 38%|███▊      | 6971392/18165135 [00:12<00:17, 644573.99it/s]\u001b[A\n",
            " 39%|███▉      | 7127040/18165135 [00:12<00:17, 637425.03it/s]\u001b[A\n",
            " 40%|████      | 7290880/18165135 [00:12<00:16, 641230.08it/s]\u001b[A\n",
            " 41%|████      | 7454720/18165135 [00:13<00:16, 644485.46it/s]\u001b[A\n",
            " 42%|████▏     | 7618560/18165135 [00:13<00:16, 646744.89it/s]\u001b[A\n",
            " 43%|████▎     | 7774208/18165135 [00:13<00:16, 638439.30it/s]\u001b[A\n",
            " 44%|████▎     | 7938048/18165135 [00:14<00:15, 642178.41it/s]\u001b[A\n",
            " 45%|████▍     | 8101888/18165135 [00:14<00:15, 645535.75it/s]\u001b[A\n",
            " 45%|████▌     | 8257536/18165135 [00:14<00:15, 638043.63it/s]\u001b[A\n",
            " 46%|████▋     | 8421376/18165135 [00:14<00:15, 641843.64it/s]\u001b[A\n",
            " 47%|████▋     | 8585216/18165135 [00:15<00:14, 644809.56it/s]\u001b[A\n",
            " 48%|████▊     | 8749056/18165135 [00:15<00:14, 646997.07it/s]\u001b[A\n",
            " 49%|████▉     | 8904704/18165135 [00:15<00:14, 638503.18it/s]\u001b[A\n",
            " 50%|████▉     | 9068544/18165135 [00:15<00:14, 642659.51it/s]\u001b[A\n",
            " 50%|█████     | 9150464/18165135 [00:15<00:16, 547457.43it/s]\u001b[A\n",
            " 51%|█████     | 9306112/18165135 [00:16<00:15, 566986.02it/s]\u001b[A\n",
            " 52%|█████▏    | 9469952/18165135 [00:16<00:14, 589659.88it/s]\u001b[A\n",
            " 53%|█████▎    | 9633792/18165135 [00:16<00:14, 606213.17it/s]\u001b[A\n",
            " 54%|█████▍    | 9789440/18165135 [00:16<00:13, 611549.05it/s]\u001b[A\n",
            " 55%|█████▍    | 9953280/18165135 [00:17<00:13, 622735.60it/s]\u001b[A\n",
            " 56%|█████▌    | 10117120/18165135 [00:17<00:12, 630070.74it/s]\u001b[A\n",
            " 57%|█████▋    | 10280960/18165135 [00:17<00:12, 636725.65it/s]\u001b[A\n",
            " 57%|█████▋    | 10436608/18165135 [00:17<00:12, 632693.16it/s]\u001b[A\n",
            " 58%|█████▊    | 10600448/18165135 [00:18<00:11, 637335.99it/s]\u001b[A\n",
            " 59%|█████▉    | 10764288/18165135 [00:18<00:11, 641744.33it/s]\u001b[A\n",
            " 60%|██████    | 10919936/18165135 [00:18<00:11, 636501.89it/s]\u001b[A\n",
            " 61%|██████    | 11083776/18165135 [00:18<00:11, 640141.93it/s]\u001b[A\n",
            " 62%|██████▏   | 11247616/18165135 [00:19<00:10, 643121.02it/s]\u001b[A\n",
            " 63%|██████▎   | 11411456/18165135 [00:19<00:10, 645877.34it/s]\u001b[A\n",
            " 64%|██████▎   | 11567104/18165135 [00:19<00:10, 638471.57it/s]\u001b[A\n",
            " 65%|██████▍   | 11730944/18165135 [00:19<00:10, 642066.62it/s]\u001b[A\n",
            " 65%|██████▌   | 11886592/18165135 [00:20<00:08, 779031.48it/s]\u001b[A\n",
            " 66%|██████▌   | 11984896/18165135 [00:20<00:09, 660269.33it/s]\u001b[A\n",
            " 66%|██████▋   | 12066816/18165135 [00:20<00:11, 553255.56it/s]\u001b[A\n",
            " 67%|██████▋   | 12214272/18165135 [00:20<00:10, 565680.40it/s]\u001b[A\n",
            " 68%|██████▊   | 12378112/18165135 [00:20<00:09, 588957.44it/s]\u001b[A\n",
            " 69%|██████▉   | 12533760/18165135 [00:21<00:09, 598173.99it/s]\u001b[A\n",
            " 70%|██████▉   | 12697600/18165135 [00:21<00:08, 612842.72it/s]\u001b[A\n",
            " 71%|███████   | 12861440/18165135 [00:21<00:08, 623990.55it/s]\u001b[A\n",
            " 72%|███████▏  | 13025280/18165135 [00:21<00:08, 631603.29it/s]\u001b[A\n",
            " 73%|███████▎  | 13180928/18165135 [00:22<00:07, 628381.78it/s]\u001b[A\n",
            " 73%|███████▎  | 13344768/18165135 [00:22<00:07, 635134.07it/s]\u001b[A\n",
            " 74%|███████▍  | 13508608/18165135 [00:22<00:07, 640089.83it/s]\u001b[A\n",
            " 75%|███████▌  | 13664256/18165135 [00:23<00:07, 634139.70it/s]\u001b[A\n",
            " 76%|███████▌  | 13828096/18165135 [00:23<00:06, 638748.18it/s]\u001b[A\n",
            " 77%|███████▋  | 13991936/18165135 [00:23<00:06, 642651.26it/s]\u001b[A\n",
            " 78%|███████▊  | 14155776/18165135 [00:23<00:06, 644455.71it/s]\u001b[A\n",
            " 79%|███████▉  | 14311424/18165135 [00:24<00:06, 637174.23it/s]\u001b[A\n",
            " 80%|███████▉  | 14475264/18165135 [00:24<00:05, 641236.16it/s]\u001b[A\n",
            " 81%|████████  | 14639104/18165135 [00:24<00:05, 644296.34it/s]\u001b[A\n",
            " 81%|████████▏ | 14794752/18165135 [00:24<00:05, 636592.93it/s]\u001b[A\n",
            " 82%|████████▏ | 14958592/18165135 [00:25<00:05, 640996.44it/s]\u001b[A\n",
            " 83%|████████▎ | 15122432/18165135 [00:25<00:04, 644078.92it/s]\u001b[A\n",
            " 84%|████████▍ | 15278080/18165135 [00:25<00:04, 636901.82it/s]\u001b[A\n",
            " 85%|████████▌ | 15441920/18165135 [00:25<00:04, 640779.58it/s]\u001b[A\n",
            " 86%|████████▌ | 15605760/18165135 [00:26<00:03, 644076.64it/s]\u001b[A\n",
            " 87%|████████▋ | 15769600/18165135 [00:26<00:03, 645957.88it/s]\u001b[A\n",
            " 88%|████████▊ | 15925248/18165135 [00:26<00:03, 638048.13it/s]\u001b[A\n",
            " 89%|████████▊ | 16089088/18165135 [00:26<00:03, 642185.48it/s]\u001b[A\n",
            " 89%|████████▉ | 16252928/18165135 [00:27<00:02, 645121.51it/s]\u001b[A\n",
            " 90%|█████████ | 16408576/18165135 [00:27<00:02, 636896.08it/s]\u001b[A\n",
            " 91%|█████████ | 16572416/18165135 [00:27<00:02, 640790.75it/s]\u001b[A\n",
            " 92%|█████████▏| 16736256/18165135 [00:27<00:02, 644053.03it/s]\u001b[A\n",
            " 93%|█████████▎| 16891904/18165135 [00:28<00:01, 636834.52it/s]\u001b[A\n",
            " 94%|█████████▍| 17055744/18165135 [00:28<00:01, 640681.54it/s]\u001b[A\n",
            " 95%|█████████▍| 17219584/18165135 [00:28<00:01, 644005.67it/s]\u001b[A\n",
            " 96%|█████████▌| 17383424/18165135 [00:28<00:01, 646347.14it/s]\u001b[A\n",
            " 97%|█████████▋| 17539072/18165135 [00:29<00:00, 637746.74it/s]\u001b[A\n",
            " 97%|█████████▋| 17702912/18165135 [00:29<00:00, 642148.82it/s]\u001b[A\n",
            " 98%|█████████▊| 17866752/18165135 [00:29<00:00, 644817.77it/s]\u001b[A\n",
            " 99%|█████████▉| 18022400/18165135 [00:29<00:00, 637370.60it/s]\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "Extracting ./kmnist/KMNIST/raw/train-images-idx3-ubyte.gz\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "0it [00:00, ?it/s]\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "Downloading http://codh.rois.ac.jp/kmnist/dataset/kmnist/train-labels-idx1-ubyte.gz to ./kmnist/KMNIST/raw/train-labels-idx1-ubyte.gz\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "  0%|          | 0/29497 [00:00<?, ?it/s]\u001b[A\u001b[A\n",
            "\n",
            "32768it [00:00, 38685.72it/s]            \u001b[A\u001b[A\n",
            "\n",
            "0it [00:00, ?it/s]\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "Extracting ./kmnist/KMNIST/raw/train-labels-idx1-ubyte.gz\n",
            "Downloading http://codh.rois.ac.jp/kmnist/dataset/kmnist/t10k-images-idx3-ubyte.gz to ./kmnist/KMNIST/raw/t10k-images-idx3-ubyte.gz\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "  0%|          | 0/3041136 [00:06<?, ?it/s]\u001b[A\u001b[A\n",
            "\n",
            " 40%|███▉      | 1204224/3041136 [00:06<00:00, 12010466.40it/s]\u001b[A\u001b[A\n",
            "\n",
            " 78%|███████▊  | 2383872/3041136 [00:06<00:00, 11906036.96it/s]\u001b[A\u001b[A\n",
            "\n",
            "3047424it [00:06, 466399.54it/s]                               \u001b[A\u001b[A\n",
            "18169856it [00:42, 637370.60it/s]                              \u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "Extracting ./kmnist/KMNIST/raw/t10k-images-idx3-ubyte.gz\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "0it [00:00, ?it/s]\u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "Downloading http://codh.rois.ac.jp/kmnist/dataset/kmnist/t10k-labels-idx1-ubyte.gz to ./kmnist/KMNIST/raw/t10k-labels-idx1-ubyte.gz\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "  0%|          | 0/5120 [00:00<?, ?it/s]\u001b[A\u001b[A\n",
            "\n",
            "8192it [00:00, 11515.48it/s]            \u001b[A\u001b[A"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "Extracting ./kmnist/KMNIST/raw/t10k-labels-idx1-ubyte.gz\n",
            "Processing...\n",
            "Done!\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Q4WPES8CE2lC",
        "colab_type": "code",
        "colab": {},
        "outputId": "c6326948-e7b4-4793-96a1-a3760af4d559"
      },
      "source": [
        "kmnist_sample, kmnist_target = iter(kmnist_loader).next()\n",
        "kmnist_sample = kmnist_sample.to(DEVICE)\n",
        "print(kmnist_target)\n",
        "# sns.set_style(\"dark\")\n",
        "show(make_grid(kmnist_sample.cpu()))"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "tensor([2, 9, 3, 8, 3])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAABoCAYAAADo66t9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAcmklEQVR4nO2dedyUVRXHvyfcUjJRU1FMwHBPxchArUwhcINcQ03JJZfcP5iClmmmuaOWG4miZoq75JprZRbiviHuC4qo5Za2SN7+mPnNvTPvzPvOvO8sz9D5fj58mHnmvjN37nOfZ84953fOtRACjuM4TvvxmVZ3wHEcx+kefgN3HMdpU/wG7jiO06b4DdxxHKdN8Ru44zhOm+I3cMdxnDalRzdwMxtlZrPN7Hkzm1CvTjmO4zhdY93VgZtZL+BZYAQwB5gJ7BxCeLp+3XMcx3EqsVAP/nZD4PkQwosAZnYlMAaoeAM3M88achzHqZ13QghfKD3YExfKSsBryfM5+WNFmNk+ZvagmT3Yg89yHMf5f+aVcgd7YoFbmWMdLOwQwmRgMrgF7jiOU096YoHPAVZOnvcD3uhZdxzHcZxq6YkFPhMYZGYDgNeBscAu3X2zPfbYA4A//vGPALzwwgs96NqCzQorrADA+uuvD8Btt91Wse1SSy0FwGqrrQbAgw/mPFmffvppI7uYeX784x8DcPzxx1dso7m47777AvDMM88UXlt55Zzt8oUv5NySf//73wEwyy1MX3rppTr3uDJ9+vQBYOLEiQAMGzYMgI022qjQRud79uzZAIwZMwaI15n6nT6WwMEL3mWXbt/AQwjzzexA4HagF3BRCOGpuvXMcRzH6ZSeWOCEEG4BbqlTXxzHcZwa6NENvJ784Q9/AOCggw4C4IgjjgDgk08+aejn9u3bt/BYn/XOO++UbfvFL36x8Fgun48//hiAa6+9FoAXX3yxIf1M+epXvwrAnnvuCXTuQpGr4LDDDgPguuuuK/rbDz/8sGH9zCJLLLEEALvuumvR8X/961+Fx9/73vcAuP7664HoflhzzTULbX7zm98AcMoppxS1mTx5MgBDhgwptG20O/Czn/0sADvttBMASy+9NADnn39+oc1///tfAAYOHAjEub766qsDsd8Qv6dcRieeeCLQ+TxrN/r16wfAPvvsA8Buu+1WeG2hhXK3xaeffrqozSuvlBWCtBRPpXccx2lTup2J2a0Pq0JGOHjwYADWWGMNAK644oqG9GWbbbYB4JJLLikck5WyySabAPC3v/0NiNargoYA7733HgBf/vKXARgwYAAA48aNK7SRtVtvjjrqKCCuUmRNPvTQQwBsuOGGhbaXXXYZAEsuuWTRe2y88cYA3H///Q3pY9ZYfvnlAbjjjjsAWGuttQC4++67ATj99NMLbW+//faiv9V8uPjiiwvHbrkl5znU3Pj85z8PwHPPPQfACSecUGg7adKkOn2L8px55pkAHHLIIUA85/vtt1+hjQKTWin885//BGCRRRYB4K677iq01fcVjz76KABf+cpXit6jHVl88cUBuOmmmwD41re+1aGNvu/YsWMBePbZZ4GWB3MfCiEMKT3oFrjjOE6bkhkfuHjkkUcA2HHHHYH6WeCf+Uzut0o+4WWWWQaAjz76qNBGfrH77rsPgF69egFw4YUXArD99tsX2spnKpne888/DxT7Vhtlgb/2Wi4BVlafrAlZCKkkrJTHHnsMgHfffbchfcsSOucQpYBaMZ133nkAHHrooQD85z//6fD3Ov9nnHEGEOcHxJWbrFH5oTX26Sqo0UjueMABBwDRhz9ixIhCG8V1JCO98847AfjTn/4EwOc+97mK769xlLWexgvaBck+L7jgAgC+/vWvF73+xhsxhWXChFxdPkkus4xb4I7jOG1K5ixwoej4wgsvDPRcjaKEDf2q/vznPwfgG9/4RqGNLKxll10WiMoS+ZpTi26xxRYDoi/83nvvLTreSKZNmwbEeMH+++8PRCtipZViSZpFF10UgJkzZwIwfPhwAD744IOG97PVKHkJYpKLVleKI5SzvMXo0aOBOM5SeUBcKYq5c+cCMGPGDKA46afRSC3zta99DYhz+rTTTiu0UfLXOuusA8D3v/99AP7xj38AcbVRDs3tdrO8dR0DHHzwwUBclUhpItIYyO9///uaP0vjp1Vws+IEboE7juO0KX4DdxzHaVMy60KRzElLk+66UHbZJVeeRYEeScSU0KHgBsD8+fMBmDNnDgA//elPgRi8SSWHCiCOHz8eiEERBTwbiZb9+uyTTjoJiMu2J598stBW8rljjjkG+P9wnayyyioA/Pa3vy0cU+KN3GFyfZVDrrK99toLiAHqVF5YKinTc7kZlDDTDPTZ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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "38OHYXZPE2lG",
        "colab_type": "code",
        "colab": {},
        "outputId": "ddccf943-ca8d-47dd-c14d-ff38e2bf4da0"
      },
      "source": [
        "out, logvar = model(kmnist_sample)\n",
        "out = out.detach().cpu()\n",
        "out = out.view(-1, 1, 28,28)\n",
        "logvar = logvar.detach().cpu()\n",
        "logvar = logvar.view(-1, 1, 28,28)\n",
        "print(out.size())\n",
        "show(make_grid(out))"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "torch.Size([5, 784]) torch.Size([5, 784])\n",
            "torch.Size([5, 1, 28, 28])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "LucqxP4mE2lK",
        "colab_type": "code",
        "colab": {},
        "outputId": "95edb113-1f09-4d25-d8df-459ac285b4b5"
      },
      "source": [
        "x = kmnist_sample[1,:,:,:]\n",
        "y_mean, y_std = out[1,:,:,:], torch.exp(logvar[1,:,:,:])\n",
        "\n",
        "res_list = [x.cpu().view(28,28).numpy(), y_mean.view(28,28).numpy(), y_std.view(28,28).numpy()]\n",
        "print(res_list[0].shape)\n",
        "display_images(res_list, titles=['input','mean', 'std'], cols=len(res_list), interpolation=None, cmap=\"viridis\")"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "(28, 28)\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAACT0AAAL+CAYAAABlzCJfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzde5hkZ10n8O+vu+eWyUwSEnIhBBLAIIiAIlcBIYioIAgrrIgLuC7uA4rIAiLsPhKX9QIqeFtlUVZkWVgEFNYVFmQFQSAh4GVBrkK4SEJukJlc5tr97h9Vs6mMc+lJ5u2et+fzeZ5+nuqq09/3VFdX9XnrfM+paq0FAAAAAAAAAABgFHOrvQIAAAAAAAAAAABHQukJAAAAAAAAAAAYitITAAAAAAAAAAAwFKUnAAAAAAAAAABgKEpPAAAAAAAAAADAUJSeAAAAAAAAAACAoSg9AQAAAAAAAAAAQ1F6AgAAAAAAAAAAhqL0BAAAAAAAAAAADEXpCQAAAAAAAAAAGIrSEwAAAAAAAAAAMBSlJwAAAAAAAAAAYChKTwAAAAAAAAAAwFCUngAAAAAAAAAAgKEoPQEAAAAAAAAAAENRegIAAAAAAAAAAIai9AQAAAAAAAAAAAxF6QkAAAAAAAAAABiK0hMAAAAAAAAAADAUpSfguFdVX6yqNv06d7XXBwAAAAAAgLWlqi6c2R914WqvD8BaoPQEAAAAAAAAAAAMRekJgIOqqnNnjjr44mqvDwAAAAAAwNHmLEwAY1J6AgAAAAAAAAAAhrKw2isAsNpaa+eu9joAAAAAAAAAAMvnTE8AAAAAAAAAAMBQlJ4AAAAAAAAAAIChKD0Bx72q+mJVtenXuQe4/X0ztz9set1tquqFVXVJVV1dVTuq6gtV9ZqquscyxnztTObTZzJ/tqo+UlVXzWT+QVXdZxmZF85kXriM5R82s/z79rvt6VXVklw6c/UdZ5a/2dfhxgIAAI6OA22HV9V9qur3q+qzVXVDVW2vqg9U1VOrqg6Q8YiqemtVfb6qdlbV16rqT6vqIUe4LlVVj6+qP5qOvW2a95WqeltVPa2qFpaZdbeqem5V/UlVfaaqrquqPdO50Uer6pVVdfdlZh31ORwAAHDsq6pzquolVfX+qrqiqnZN5xaXTve9/GFVPbmqTpv5mfdN51cvmYl6yUH2h7z2EGPfb5p/6XS+8bWq+mBVPbuqTux4twGOa8t64wmAm1TVdyZ5U5Kz97vpvOnX06rqma213z+CzAckectBMn88yY9V1ctaay++5WsOAACsNVX14iT/Mcn8fjc9ePr1iKp6emutVdXmJG9M8gP7LXtGkh9M8riqel5r7ZXLGPeeSf4oyb0PcPPtp1+PS/KiqnpCa+2Th8j64yRPPMjNp02/7pPkOVX1m0me31pbPNw6zuQf9TkcAABwbKmqf5vklUk27XfT+iQnJjk3yX2TPD3JBzOZLx2tsV+W5Pm5+QlHNmYy13pQkp+sqscfrfEAuInSE8CRuUeSX85kA/nKJB9Ick0mb55fkMnG9HySV1XVJ1prH15G5h2TvCLJKUluSPKXSa5IcmaShyfZnMmG8ouqaqG19rNH9R4d2KeS/OckW5I8dXrddUletwJjAwAAy1BVz0zyi9NvP5bk40kqyUOS3Gl6/VOTfKaqfiXJW5M8KsnuJH+d5AtJtiZ5RJJTpz/7iqq6pLX214cY96FJ/mz6s0myN8lHk3wmyZ5MdiY8OJM3+e+a5ENV9cDW2qcOEnmHmZxPJvlckmuTLCY5PZMdE2dP1+9nkmxI8qxD/nJu0mMOBwAAHEOq6geTvGrmqu1JPpzknzKZZ5yU5PxM5gfr9/vxP03yiST3y2TukSSXJPnIAYa66ABj/2omhad9rkvy3kzmH2dnsp/nrknekeRtR3C3AFgGpSeAI/Nrmbx2Pi/Jb7XW9u67oarOyWSj9R6ZlJR+MZM30Q/nxZlsZL8hybNaa9tmMk/KZEP9h6dXvaCq3tlae+9RuC8H1Vq7OMnFNfm4v32lp6+31n6q57gAAMAR+Y0kX03ypNbah/ZdWVXzSX4lN73x/oIk6zIpPL0vydNaa1+eWf6kTN7of/j0qpfOXL6ZqjozyR/npsLTG5O8oLX21f2WOyPJ7yV5fCY7GN5UVd92kDM0vTfJryd5V2tt+wHGrCSPSfKaJLdN8syqesOhilkzeszhAACAY8uFM5d/J8kLW2s37r/Q9GPmvi+TM8kmSVprvzm97cLcVHp6R2vtwv1//gB5D8tkrrHPG5I8c3ZeU1WnJ/lvSb4nyz94A4Blmjv8IgDM2JBJMekVs2+WJ0lr7StJnpykTa96WFWdtYzM9Zm80f6vZgtP08xtSZ6S5F0zV7/slq48AACwpiwmeeRs4SlJpsWiF2ZyBtckOTmTnQD/kOT7ZgtP0+W3JXlaJkdAJ8l3HWIu84uZfERDkvxBa+1H9i88TTOvyOQj6/YdsPGtSX7oQIGttRe11t58oMLT9PbWWvuz3Pxj+Z59kPXbX485HAAAcIyYFpnuNf32K0l++kCFpyRprV0/nXv83FEa/pcyOSNtkrw7k/08N5vXtNauzOSjv/8u//wsUwDcSkpPAEfm4621Vx/sxtbaJzI57Wky2dC9z8GWnf2xTDbClw6SuZTkp3PTG/H3rap7HWhZAADguPKqg31k3HQe8eb9rn5Ra23nQZb/SpJ95akDzmWq6raZHJSRJNuSPPdQKzctX7145qqnHGzZ5ZiekXbf/X3EMn+sxxwOAAA4dmyduXxNa60ddMmjqKrunuSBM1c95xD7eXbm5meEAuAo8fF2AEdm/50GB/K3mXz2c5Kcu4zlP9ha+/yhFmitfbaqPpzkQdOrHp7k75eRDQAArF1vPcztn5i5vCPJO5ex/EOnl887wO3fncmZk5Lkf7XWrj/sGiYXJ7kxyQlJHny4havq/CTfkeTOmXws3obcdOR0ptclyalVdc60rHUoPeZwAADAseOqTOY7m5J8a1U9tLX2/hUYd/YjwS9prX36MMu/N8k/Jbl9v1UCOP4oPQEcmY8vY5lrZi6fdNClbnLRMseeLT192zJ/BgAAWLv+4TC3f2Pm8mf3/3i3wyy/9QC3zx7FfH5V/c5h8vbZd6T1KVW1ubV2w/4LVNWjk7w0RzbXOS2Tj684lB5zOAAA4BjRWttTVX+a5EeSzCd5T1W9JclbkvxVa+2aQwbccveeuXzx4RZurbWqujhKTwBHldITwJHZtoxl9sxcXreM5b+8zLFn38y/7TJ/BgAAWLsONz+ZLTktZy4zu/yB5jK3m7l83+nXkTolyc1KT1V1YZKX3IKsLctYpsccDgAAOLY8N8m3J/nmTLbpnzz9alX16SQfSPLuJH9+sI/8vgVm99Pckv08ABwFc6u9AgCD6fFZ0Dcuc7nZHQPLeXMfAABYw1prRzI/ORpzmaNxFqSbHYBXVY/MzQtPf53kGZmc8em0JBtba7XvK8lfzSy7nPe1eszhAACAY0hr7cpMDsq4MMllMzdVkrsl+YlMzvx0WVX9XFXNH4VhT5y5fEv28wBwFCg9Aay+E5a53OaZy9cdhXH9DwAAAI7E7Bv0PzNbRjqCry/ul/mCmcuvbq09pLX2B621v2utXdNa27Xf8g4AAQAA/pnW2vWttV9Ick4mBajnJXlbkqtnFjslyS8neWtV1a0c8vqZy7dkPw8AR4Ed3gCr7w63YLmrD3D77EcyLOfjS4/GUdoAAMDx44qZy990a8OmR1d/1/TbpST/YRk/ttz5EwAAcBxqrS211j7aWntFa+3xSc5I8uBMClD7PC7Jv7iVQ101c3m585RzbuWYAOxH6Qlg9T1wmcs9YOby3xzg9tmzP526jLxvXcYyPgoCAADY5+KZy486CnmnJVk/vXxla+2qQy1cVXef/gwAAMCyTEtQH0zyhCTvmrnpsfsveoTRfzdz+QEHXWpqemap+x/hGAAchtITwOp7UFXd+VALVNX5uXk56r0HWOzSmcv3Xsa4T1rGMjtnLq9bxvIAAMDa9a4ke6eX71JVj7mVeUszlzct4+MlnnkrxwMAAI5TrbWW5M9nrjpjv0WOdH/I7H6a76iqbz7M8hckuf0ycgE4AkpPAKuvkvxWVR3wNXl6/W9Nl0uSj7bW/v4Ai16Sm45EuH9V3e2gA1Y9K8m3LGPdrs1NOyJOryrFJwAAOE611r6a5PUzV72qqs5ezs9W1VxV3Xa/q69Jsn16+aTc9FF3B/r574zSEwAAsJ+q2lJV6w+/ZJKbfwzd/meavWbm8mHnOa21Tya5aOaq3zjEfp6NSX5tmesIwBFQegJYfbuTfH+S11XVSbM3TL9/fW7+0REvOlBIa+1ruenIgkryxqq62VEDVbVQVc/LpES163Ar1lrbleSz028Xkjz+sPcGAABYy16c5PLp5bOTXFJVP3SIN/fPrqrnJPl0kn85e1trbSnJO2au+sOqut8BMp40XW4+yQ23/i4AAABryH2SfKmqfqGqDniwd1XNV9VTkjx75up37LfYx2cuP2r//TUH8e9nfyaT/Txb9xv79CRvy+QTOnYvIxOAI7Cw2isAQH4pyXOSPCXJ46rqL5NckcmpVS9IcuLMsq9orb3nEFkvTvKhTEqt90ry2ar6P0kuS3KbJA9NcnqS6zMpT/32Mtbvrblpw/31VfW0JP+YZM++BVprz19GDgAAMLjW2uVV9bhMdhCcluSsJG9OcmVVXZzJXGYuyalJ7pHkTrnprLUH8tIkj0uyKcm5SS6qqg9ncvDF+kw+5vu86bK/n+T8HOKMUAAAwHHpzCQ/n+Tnq+qKJH+b5GuZfDz3mZkUo86aWf4DSf7HfhmXJPlyJmeDOjPJp6vq3Umuzk2fsnFJa+1N+36gtfaXVfXKJM+dXvWUJI+d7ue5MpMDRS5IsjHJF5O8PZP9QQAcJUpPAKvvS0keneQtSW6X5LEHWGYpya8neeGhglprF1fVM5K8OpOjoDclecx+i12eyRHW88tcv5dncoanu2fyOdbff4BllJ4AAOA40Vq7pKq+I8lrkjxievXpSX7gED92RZLPHSDrk1X15CRvSHJCJgWpB02/Zr06yU8nedetW3sAAGCN2ZFJuWnffu8zknzvIZZ/S5J/PT3z7P/XWluqqmcm+ZMkGzIpPj11v5/9oyRv2u+652WyD+ffZTKf2ZLJgR2zPpfkB5M8aRn3B4AjoPQEcAxorX24qu6V5CeSPCGTI5xPzKSg9N4kv9ta++gys/5rVV2UyQb2BZkcvbAzyaWZnLXpv7TWrq6qhy0zb/v0IyaemclOjLslOTmTAhQAAHAcaq19Kcl3V9UDkzwxk7PKnpPklEx2OFyTyRv7H03y7iTva63tPUjW26vqHpnMYb4nkyOr92ZyxtoPJnlta+39SVJ1qJNGAQAAx5vpweCnJ/nuJA9O8m1J7pzJ2Wfnk2xP8vkkFyV5fWvtI4fIekdV3SfJT02z7pjJvpqDTkRaay3J86vqzUmeleRhmRSv9o37x0leM93XcuvuLAD/TE1ehwFYSVX12iRPm377Y621167e2gAAAAAAAADAWOZWewUAAAAAAAAAAACOhNITAAAAAAAAAAAwFKUnAAAAAAAAAABgKEpPAAAAAAAAAADAUJSeAAAAAAAAAACAoSg9AQAAAAAAAAAAQ6nW2mqvAwAAAAAAAAAAwLI50xMAAAAAAAAAADAUpScAAAAAAAAAAGAoSk8AAAAAAAAAAMBQlJ4AAAAAAAAAAIChKD0BAAAAAAAAAABDUXoCAAAAAAAAAACGovQEAAAAAAAAAAAMRekJAAAAAAAAAAAYysLRDnzk3BPb0c7k2LNw3h27j/H1B5zVNX/rGy/qmr8WzJ9xevcxdt7rDl3z173nb7vmJ0mWFvuPAcBR8xdLb67VXgeObd978o+b00CSzK3Ay+XS+E+31vrehyr/to4HbbH/vLLm57uP0V3v16U18JrE8eF/X/sa/xw4KPtoAFhxKzFv7Tz3XhP3AQZxtPfRONMTAAAAAAAAAAAwFKUnAAAAAAAAAABgKEpPAAAAAAAAAADAUJSeAAAAAAAAAACAoSg9AQAAAAAAAAAAQ1F6AgAAAAAAAAAAhqL0BAAAAAAAAAAADEXpCQAAAAAAAAAAGIrSEwAAAAAAAAAAMBSlJwAAAAAAAAAAYChKTwAAAAAAAAAAwFCUngAAAAAAAAAAgKEoPQEAAAAAAAAAAENRegIAAAAAAAAAAIai9AQAAAAAAAAAAAxF6QkAAAAAAAAAABiK0hMAAAAAAAAAADAUpScAAAAAAAAAAGAoSk8AAAAAAAAAAMBQlJ4AAAAAAAAAAIChKD0BAAAAAAAAAABDUXoCAAAAAAAAAACGovQEAAAAAAAAAAAMZWG1V4AxXf2Q23UfY9OPXt53gDf2jV8LPvXSO3Yf47OPflXX/If+3yd1zU+SU370G13zF6/5etd8AIBj0lz1zV9qffPXgrXwO+r9d5Skar7vACtwH7Jnb9f41vr+LdX8+Mf0VTr/HSUr87fU21p4XeL4ML8Cz2ng2Fad/+923r4COCJr4TVpLdwH/3s4To3/rhAAAAAAAAAAAHBcUXoCAAAAAAAAAACGovQEAAAAAAAAAAAMRekJAAAAAAAAAAAYitITAAAAAAAAAAAwFKUnAAAAAAAAAABgKEpPAAAAAAAAAADAUJSeAAAAAAAAAACAoSg9AQAAAAAAAAAAQ1F6AgAAAAAAAAAAhqL0BAAAAAAAAAAADEXpCQAAAAAAAAAAGIrSEwAAAAAAAAAAMBSlJwAAAAAAAAAAYChKTwAAAAAAAAAAwFCUngAAAAAAAAAAgKEoPQEAAAAAAAAAAENRegIAAAAAAAAAAIai9AQAAAAAAAAAAAxF6QkAAAAAAAAAABiK0hMAAAAAAAAAADAUpScAAAAAAAAAAGAoSk8AAAAAAAAAAMBQlJ4AAAAAAAAAAIChLKz2CjCmr39L/zH+/K7/vWv+U3/0eV3zT/3g5V3zk+Sqh96ua/57HvWrXfOTZF2d2DX/w/d6a9f8JHnY/Z/RNX/DO77eNR8AWIPmqm9+rcDxM4uL/ccY3Vp4nNtS3/jFvvlJUvN989vuFbgP1flvaS3o/nxYgde8pdY1vrW++UlS850fh86/ozWh9/+e9H/tXpHXPNsxcGxbideBFfi/yHFgrvNkI+k+J6v5FbgPnbXO24i1EttX7sPhLa2B7Tf/ezhOOdMTAAAAAAAAAAAwFKUnAAAAAAAAAABgKEpPAAAAAAAAAADAUJSeAAAAAAAAAACAoSg9AQAAAAAAAAAAQ1F6AgAAAAAAAAAAhqL0BAAAAAAAAAAADEXpCQAAAAAAAAAAGIrSEwAAAAAAAAAAMBSlJwAAAAAAAAAAYChKTwAAAAAAAAAAwFCUngAAAAAAAAAAgKEoPQEAAAAAAAAAAENRegIAAAAAAAAAAIai9AQAAAAAAAAAAAxF6QkAAAAAAAAAABiK0hMAAAAAAAAAADAUpScAAAAAAAAAAGAoSk8AAAAAAAAAAMBQlJ4AAAAAAAAAAIChKD0BAAAAAAAAAABDUXoCAAAAAAAAAACGovQEAAAAAAAAAAAMZWG1V4Axbf5qdR/j/HWbu+Zf9PJXdc1fbEtd85Nkvnr3Fk/snN/fL1191+5jbLh6Z/cxAACOyFLrPMBi5/z+Wuv9O0qqOs+bej/O833jkyQLfd+WqPn+j3P27O0/Rmdtb+f7sNR3ftz2dI1fEW2x/3sItX5d3wHm+h9b2Xb3fbC7/47Wgvn+/xyq9/+3uf7va/bfFgNulRWYC3Cc6D3nWwG1fv1qr8KtVp3nlXObNnbNX4ntq+46b6cnSdu9u29+73lxkiz2fT+tdc73/5NjlTM9AQAAAAAAAAAAQ1F6AgAAAAAAAAAAhqL0BAAAAAAAAAAADEXpCQAAAAAAAAAAGIrSEwAAAAAAAAAAMBSlJwAAAAAAAAAAYChKTwAAAAAAAAAAwFCUngAAAAAAAAAAgKEoPQEAAAAAAAAAAENRegIAAAAAAAAAAIai9AQAAAAAAAAAAAxF6QkAAAAAAAAAABiK0hMAAAAAAAAAADAUpScAAAAAAAAAAGAoSk8AAAAAAAAAAMBQlJ4AAAAAAAAAAIChKD0BAAAAAAAAAABDUXoCAAAAAAAAAACGovQEAAAAAAAAAAAMRekJAAAAAAAAAAAYitITAAAAAAAAAAAwFKUnAAAAAAAAAABgKEpPAAAAAAAAAADAUJSeAAAAAAAAAACAoSys9gowprNe/Tfdxzjvnv+ma/4lj/rNrvnvufH2XfOT5FEnfLVr/inzJ3TNT5IXXnHvrvkff+SpXfOTJFd/vP8YAAAcVVXVfYzWWtf8Wug8pZ9fgeOk5uf7j9Fb57+l2ru3a36StD17uo/R09LOnd3HqHXru+a3Pbu75k8GWeoaP3fi5q75SZINfR+HVOfXvbn+/3u6W4HXpO6/p6W+/5+TrI3HGqC3FZiTddd526FWYL7Ue15Z61ZgV/SGDX3zT9rSNb72rMD21e7Oc77N/fcnZvt1ffN39J9X9n7da723c1fiZXtpcQUGYa1xpicAAAAAAAAAAGAoSk8AAAAAAAAAAMBQlJ4AAAAAAAAAAIChKD0BAAAAAAAAAABDUXoCAAAAAAAAAACGovQEAAAAAAAAAAAMRekJAAAAAAAAAAAYitITAAAAAAAAAAAwFKUnAAAAAAAAAABgKEpPAAAAAAAAAADAUJSeAAAAAAAAAACAoSg9AQAAAAAAAAAAQ1F6AgAAAAAAAAAAhqL0BAAAAAAAAAAADEXpCQAAAAAAAAAAGIrSEwAAAAAAAAAAMBSlJwAAAAAAAAAAYChKTwAAAAAAAAAAwFCUngAAAAAAAAAAgKEoPQEAAAAAAAAAAENRegIAAAAAAAAAAIai9AQAAAAAAAAAAAxF6QkAAAAAAAAAABjKwmqvAGNa2rmz+xjnP+NjXfOfdocf7pqfxaW++UnOef+fdc3/zvmu8UmS97/8AV3zt159Udd8AIAjNlf9x1hqffNX4j70Vv2PAarev6eFvlP6mluB46Q2rO+bv3exb36StntP3/wVmFvW+r6PQ9u7t2v+iuj8fK51nZ8LK6Hza1KSZL7vGxV1wqau+StiT9/nW+u9jZGswHZM/9fV7vcBVlOtwFygeQ4dE3o/1p3nZNV5uyFJ923Eua1bu+aviJO39B9joe9jvefUzV3z20L/uff6y7Z1zW8nbOianyS1se+caW7b9V3zV0LdcEPX/KUbdnTNT9J9ztf27O6az+pwpicAAAAAAAAAAGAoSk8AAAAAAAAAAMBQlJ4AAAAAAAAAAIChKD0BAAAAAAAAAABDUXoCAAAAAAAAAACGovQEAAAAAAAAAAAMRekJAAAAAAAAAAAYitITAAAAAAAAAAAwFKUnAAAAAAAAAABgKEpPAAAAAAAAAADAUJSeAAAAAAAAAACAoSg9AQAAAAAAAAAAQ1F6AgAAAAAAAAAAhqL0BAAAAAAAAAAADEXpCQAAAAAAAAAAGIrSEwAAAAAAAAAAMBSlJwAAAAAAAAAAYChKTwAAAAAAAAAAwFCUngAAAAAAAAAAgKEoPQEAAAAAAAAAAENRegIAAAAAAAAAAIai9AQAAAAAAAAAAAxF6QkAAAAAAAAAABiK0hMAAAAAAAAAADCUhdVeATio1rrG7/3SV7rmX/OMB3bNT5Lv3Ni3t/i67ad1zU+SU/7ic13zF7umAwDcAkt9t3OTJHPVf4zeev+eNqzAdLgtdY2vTRu75reF+a75SdI2d74P6/s/znPbN3XNr85z4yTJfN+5Ze3tOzObX7+ua36SZKnv87nN93++9bZ44vruY9Ri3+fD0vq+j8PcjXu65ifJ3K6+Y9R1/bcx2nW7u48B3AorsW3SW63AfGlN/J46byOu67utXgsrMBc4ve8+lKXNfecaSbJ4Ut85WS323Y5Oku13OqFr/tJ839eMpRWYzuy55xld89dd1/81b25v3/ytX97cd4Aktbfv72l+286u+XNfvqxrfpK0vX0f6La4AnuOO78fuCa2MY4yZ3oCAAAAAAAAAACGovQEAAAAAAAAAAAMRekJAAAAAAAAAAAYitITAAAAAAAAAAAwFKUnAAAAAAAAAABgKEpPAAAAAAAAAADAUJSeAAAAAAAAAACAoSg9AQAAAAAAAAAAQ1F6AgAAAAAAAAAAhqL0BAAAAAAAAAAADEXpCQAAAAAAAAAAGIrSEwAAAAAAAAAAMBSlJwAAAAAAAAAAYChKTwAAAAAAAAAAwFCUngAAAAAAAAAAgKEoPQEAAAAAAAAAAENRegIAAAAAAAAAAIai9AQAAAAAAAAAAAxF6QkAAAAAAAAAABiK0hMAAAAAAAAAADAUpScAAAAAAAAAAGAoSk8AAAAAAAAAAMBQlJ4AAAAAAAAAAIChLKz2CsBqmdu4sWv+o3/q/V3zk2RX29M1/7df9sSu+Uly6raPdc2vhf4vc23v3u5jAAAckaXWN3+u+uYnqc0n9B1g44a++UmWtva9D3u29L0PO87s/zvataXvsViLfad9SZK5vSf2HaDz0zlJ0vkpXYt985fW9c1P0v1x2HWbFXhd7f04rMC7jPO7++avv7bvA33i5f3/WDdefmPX/PnrusYnSdriUv9BOqvq/5wGboW2AhtYvV8Hqv85DWpd33/utX591/y5U0/pmp8ke2+7tWv+nq19f0dJsus2fbdPVmIbcfu5fZ8PG6/p+5oxv7NrfJJksfP0fq7zdnqSbDu/b/7i+v5vICzs6vu3dMKVfZ9wm647qWt+kmTb9r75O3b0zWdVONMTAAAAAAAAAAAwFKUnAAAAAAAAAABgKEpPAAAAAAAAAADAUJSeAAAAAAAAAACAoSg9AQAAAAAAAAAAQ1F6AgAAAAAAAAAAhqL0BAAAAAAAAAAADEXpCQAAAAAAAAAAGIrSEwAAAAAAAAAAMBSlJwAAAAAAAAAAYChKTwAAAAAAAAAAwFCUngAAAAAAAAAAgKEoPQEAAAAAAAAAAENRegIAAAAAAAAAAIai9AQAAAAAAAAAAAxF6QkAAAAAAAAAABiK0hMAAAAAAAAAADAUpRrafi4AACAASURBVCcAAAAAAAAAAGAoSk8AAAAAAAAAAMBQlJ4AAAAAAAAAAIChKD0BAAAAAAAAAABDUXoCAAAAAAAAAACGovQEAAAAAAAAAAAMZWG1VwBWyxd/7tu75r/ztr/bNT9Jnnf5/bvm7zijuuYnyWVvvnPX/J2fOrlrfpLc5TVf65q/+I+Xds1fCxYf3vf5nCRzuxb75n/s013zk6Tt2tV9DACOEfPzXeNr44au+UnStmzumr+0ZWPX/CTZecYJXfOvO6fvlP66O3aNT5LsOXNP1/yNW/pv/5y4qe8Yexf7H6+2Y9e6rvmLezu/Js0tdc1Pkuo8Pd6woe9zIUluf9K2rvl7lvo+zknyte1buuZ/44tbu+bP7+7/Vuz6a/uOMb/U//nWW/V+QifJ3AqMAdxitbACu8aq8zbcCrzOzG3oO++r027TNX/HXU7rmp8kN5zRdzt6z4ld45Mku0/q+7e065TWNT9JFm7sm1+dN382XdN330OSbLy2b/628/q/ri6t6/tAXHPfFZhXbuz7WG/6TN/X7XOu6TtfSpK5bdu75lfn90yTpC32f05zc870BAAAAAAAAAAADEXpCQAAAAAAAAAAGIrSEwAAAAAAAAAAMBSlJwAAAAAAAAAAYChKTwAAAAAAAAAAwFCUngAAAAAAAAAAgKEoPQEAAAAAAAAAAENRegIAAAAAAAAAAIai9AQAAAAAAAAAAAxF6QkAAAAAAAAAABiK0hMAAAAAAAAAADAUpScAAAAAAAAAAGAoSk8AAAAAAAAAAMBQlJ4AAAAAAAAAAIChKD0BAAAAAAAAAABDUXoCAAAAAAAAAACGovQEAAAAAAAAAAAMRekJAAAAAAAAAAAYitITAAAAAAAAAAAwFKUnAAAAAAAAAABgKEpPAAAAAAAAAADAUJSeAAAAAAAAAACAoSg9AQAAAAAAAAAAQ1F6AgAAAAAAAAAAhrKw2isABzN/9/O75r/p6a/omp9s7JyfPP+27++a//Jnf7RrfpLMV+fu5f36xifJyx7zTV3z/+qCc7vmL151Vdf8lbB7a/9/Z3d98We65j/kpM93zU+Sl7zvCV3z7/qaHV3z2yUf75oPsGLmqv8YC33/N7bNm7rmJ8nSSSd0zd9xZv/7cN3Z813zt921dc3feqdru+YnyQW3/2zX/DM3bOuanyRX7t7aNf/z15/WNT9JvrL9lK75N+5a1zV/aan/MX2Le/uOsWFhsWt+ktxt69e65n/Tpiu65ifJxZvv1DX//dffpWv+rlP6/++ppb7/G7K01Dc/Sc2vgeN0ez8OsNZV3zlTW4Hn6Nz6vq9ltWVL1/wkaWec2jX/2nuc3DV/95b+c+9td+6bv35b//tw43l7uuaffMZ1XfOTZPsX+v4tnXB538dh99b+2z4nfnVX1/z12/u+/5Eku27o+3tqZ/b9HSXJSVtv7Jp/7dl93w/cdVr/+cymL6yBuUAzF1hpa+CvBgAAAAAAAAAAOJ4oPQEAAAAAAAAAAENRegIAAAAAAAAAAIai9AQAAAAAAAAAAAxF6QkAAAAAAAAAABiK0hMAAAAAAAAAADAUpScAAAAAAAAAAGAoSk8AAAAAAAAAAMBQlJ4AAAAAAAAAAIChKD0BAAAAAAAAAABDUXoCAAAAAAAAAACGovQEAAAAAAAAAAAMRekJAAAAAAAAAAAYitITAAAAAAAAAAAwFKUnAAAAAAAAAABgKEpPAAAAAAAAAADAUJSeAAAAAAAAAACAoSg9AQAAAAAAAAAAQ1F6AgAAAAAAAAAAhqL0BAAAAAAAAAAADEXpCQAAAAAAAAAAGIrSEwAAAAAAAAAAMBSlJwAAAAAAAAAAYCgLq70CjKk2bOg+xl1ed2nX/Huu39g1fyWctXBi1/zP77m+a36S/OE3Htg1/z+d/vGu+UnywlM/1zX/7Rc8omv+ljdd1TV/JWx6+0e6j/GVd6zvmv97//O7uuYnyaWPfXXX/Osfs7Nr/j3f85Nd85Pkrs/6VNf8pRtv7JoPsGLm+h8/s7hhvmv+7i3978PO21bX/Pmzbuia/+1n/FPX/CQ5c8O2rvnb9p7QNT9JPnTleV3zL7v0tK75SbKwve/zrVrX+Mzv7PtcS5K5ub534uvn9X9NWjh7qWv+ndZf2TU/ST697qy+A3T+U5rf1fnJkGRux56u+W2p799RkqQ6Px8WF/vmJ2mt/2MNa1rn51At9N32SZLa2Hkfymkn981PsuMOW7rm33BG39f7naf3fy1ed33fjYc9W/vfh9rReS7wzlO65ifJ6dv7/p72dJ5Wbr5sd98Bkqy7rO/c++TF/n+rN5zV94E49ZT++0TXzffdDv3GQt/HYXHT+OfTaSswF2Dljf+XCQAAAAAAAAAAHFeUngAAAAAAAAAAgKEoPQEAAAAAAAAAAENRegIAAAAAAAAAAIai9AQAAAAAAAAAAAxF6QkAAAAAAAAA/h879/5yW37fBfyz9uW5nplzzsyZM5fkTG5OkzQkTSxBAypWtAktaBGhKi0SBKv5oUjRYhV/0lZRaCkNVYQgVAuVqtCiWKStKWqHJGhiY+7JJDOZZM7MnDPn8tyfZ++9/CGgP4RccPLez3xOXq8/4P1dl73W+n7Xfu8NQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCtKTwAAAAAAAAAAQCuz894Aevr8z74jPsZvPfbP42N09xPPviua/6mffWs0v6rqwmdvRfM/8Z8+HM2vqnrLxnY0f+812X7qfdH09ZheupgfZL4Rjb/8oy9G86uq/u7vvS2a/3MP/0E0/6kf/EA0v6rqe3/qfdH8a//w96P5AP/XuMrmr8L5VTUsx2j+cmOI5ldVLTez+7C1dRbNvzQ/jOZXVT19dCWa/5+/8MZoflXV/H9diOZffTb7OaqqGsM/iZueZfdhfrCM5ldVHT04jebfeDT/iu4t289G87cm2XtSVdV8yJ7r8XZ23bdxN389D0en2QFOTrL5VVWr7HEax/x5AF7ZxmV+7lBDdoK12t2M5ldVne1m9+H4avZ+fHZpHevW7DG6/MlofFVV7T6XncNt3M7PHU6uZL+j2bme/SxtfjH/3cC4mz1GN75vJ5pfVTW+fS+af7bIrvmqqu4ebEXzZ7ez+7D1fP49Ua3jGc09xz89AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArczOewPIOPvT3x/N/x9/8Rei+V+zvYYxct77zB+Pj/HCX7g/mr9751PR/Kqq5f5+NP8ffOWHo/lVVb/2ut+N5i83o/H3htWYH+Ohy9H4T/+dC9H8qqpfvfL+8Ag74fy8xVsOznsTgO8Gwxp+ezJmn43DyVk0v6pqcraM5s+O8/OHcTJE8+fT7DE6Wc2j+VVVT15/TTR/57/n51hX/+dhNH96cBrNr6qq1Sobv7MRzV+HxXZ2rrv7YPZzVFX1zq1novkvrvLrgacPH4jmb7yUfUbvvJC/noeT7BjjOtbfYcOQfT4Dr3xDeJ5eVTWeZu/HwyI7f6uqWmxnn4uzg+x5GNew9n7oY9nzsH39OJpfVTWEn+2Tvfw+bJ0usgOEL7dxnv+6/u6bs99v3H1D/p40XYSv6TUsW0+Ps+9Zdm5l76vDMn+ex2X2Xdd63suG94Gv45+eAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVpSeAAAAAAAAAACAVmbnvQFk7L96I5p/cbIdzV+H93z6h6P5+7/86mh+VdXusx+KjxE3mUbjP/LF10Tzq6rqddn44e13ovmTra1oflXVwbvfFs2/+reeiuZXVf3ya/9lNP/qdDea/zU7axgj5zcP8tv/2vcP8TEAalzlx1iG81f5fRjOwjsxZuOrqsbwz4y254to/o3T/Pzk1jOXo/mPf/4sml9VNbuxHx8jbpKdAw3L7AW32J1H86uqbj+RvaB/8k0fjOZXVT02y57nF0+j8VVV9ckXHonmb97KHqPpYfa+XVVVQ3hNM1/D6+RV9p4xLvLnYUifB7jXha+hcZleMFUNk+zcYZzl/9Pg8Gr2PBw+nr0f7zydf2bNDrKfpf1r+e/i5ofZ9f2F67ej+VVVNct+z5R2ei27Lq6qevHt2XvG8MhRNL+qaphk54jHp/l15eYXst/HXXwqe0+afeVmNL+qarmGuTr3Hv/0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtKL0BAAAAAAAAAAAtDI77w0g46Hffiaa/6s/82A0v6rq31x/ZzR/+uNjNH/3Kx+K5t8zVsto/HhzM5q/Dpd3j6L5w+sfj+ZXVb3vn/x6NP+PbH05ml9V9ZGTK9H8p04ejuZXVX1s71o0/79+8K3R/Cd+8YvR/Kqq4bmPxccAuBeMp2f5MSbZ3+gsN4doflXVcju75phNVtH80+U0ml9VNW5k9+Hkcn4fpq+6GM0f1/BztdNL2ddDZ9vZnTi5nL+ex7ftRfN/9L7PRfOrqubh14AfOnxDNL+q6uD53Wj+I89n70nDMptfVTVuzKP5w8ZGNL+qajw+ieYPQ/6eAbxMY3YevQ7DNDv/Ob1/De+90/PQWfa5ODuMxldV1WI3u944upJfDEy/mr3eTl6bfa9eVXV2ITvPvft4Nv/g1fl73uKx02j+eLSGysHt8Lp1DbuwnT0NNT/M3lfX8T5wmIVPxDL7vXRV1Zhe9q1jPdNsLuafngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFZm570BZCye/Uo0/1+/443R/Kqq1dHz2QHGMZvPK8LVJ26c9ya8bHvHm9H83U99OppfVfUr73xrNn/+jmh+VdV4cBjNX52cRPOrqmrcj8a/rp6M5i+i6QD3mJW57rcyrOEYTY+HaP6tw+1o/mrMbn9VVc1W0fg7r59H86uqDh/OztcXW9H4qqqahCday/A+HL36LDtAVf3i2/9dNP/ydCeaX1X12bODaP5Hbr82ml9VtfV89lXm5p3sZ2lymP+sDotlfIy45T2wD8DLM4Tnoev4biC83pjfzb9LXM6z89zpnexz/eBadq1RVXX8UPa/JU4fzs8d9q9lz8NyeyOaX1VVF8PH6SB7TxpO82vvyY3s2ni+n/+flcVO+N49yz8btl/IjrHzmex3osN0Df+nc2E3Gr86Oo7mr4WOw9fxT08AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArSk8AAAAAAAAAAEArs/PeAHpaHR6e9yZwj5i+5Y3R/H/8xl+P5q/DbLrMDjCO2fyqWt69Gx8DAL5jJkM2f5V/9satwvOTqhqW2TE29lbR/KqqzZeyS+69Z+6P5t/d2Y3mV1UNx9No/tn9a7jehuw9Y7WGNzenW9njtNrM5r/jzV+K5ldV/antl6L5t5b5e9IHD5+I5n/0mWvR/Kqq+5/Lfpbmd86i+cPJaTS/qqrOFtH4cZGfAwAvU3huso53ifEx0seoqsbwemZY5OcOO9ez52GcZf+X4fjh7DOxqmry6uNo/vDCdjS/quryW29E8/ePNqP5VVVHN3ai+TvPZtets+zHqKqqDh/JXs+LnfyzYXEpe03Pw+9wqqp2Xwg/G9LvHNfx/DzIdhCGef48jyfWTOvmn54AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWZue9AcB3t+V9m9H8d22dRPO/Zh5Nf92ll6L5e8MQza+qqnHMjwEA/D+T8PN9Ms3mV9Vwsojmb904jeZXVV3+XPY8bN3M/o5pNcv/Tmq1kT1G4xqmurOj8Fx3Dfuw2MkOsn8te4zedN/z0fyqqsNxGc3/3Nl2NL+q6t8/945o/uYf7ETzq6rue+Ysmj9/6TCaPyyyn6OqqvE4/B5kkX0+V1V+HrNawzuK9D7AN+M93Le2jmM0yc6lJ7f3o/lVVZe+sBXNH6fZ7wZWs/y69XRrI5o/Pc0/T1788uVo/nQvfx629rPHafer2XvGne+JxldV1ST8CmSxu4b76jQ7xsbt/PW2cSt7Isb0fW+1yuZX1RD+znJ1tob1DGvnn54AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWlJ4AAAAAAAAAAIBWZue9AcB3t6d+ZDeavznMo/nrcLoK36rHMZsPAN2sPBtfCYbD42j+7IVVNL+q6r6Xptn8SfZ3TKudjWh+VdU4HaL5wyJ/npdb2fn6Yjf/6mbv8ey6afJI9nremZ5G86uqPn56fzT/N2794Wh+VdUXPvJ4NP/qF5bR/Kqq7ecOovnD0Uk0v47D+VVVY/i+t8yf55pmn58Vjq+q9Rwn4JVtFb4fny2y+VU128s+tx74THbtvf1Sfj1z5052jJMH8u8nNp/OrjcuPJvfh4397HP32Xdn92E4y66Lq6p2v5ydAJ0+dhbNr6q6/NBeNH/58Qej+VVVy53s9bYRfjaMa3hnujoJr5nS6yXOhX96AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWpmd9wYAr1zDfCM/yONH+TGa+/yLV6L51+p6NB8AOAerMZu/WGTzq2o8zuYPkyE7QFWNt/ey+cfZgzSZreGVwcY8Gj+sYR8mF3ai+eP8/mh+VdXJ5ez1sL1zEs3/9P4j0fyqqk/uPRrNf/ITfyiaX1X1qg+vovlbL51F86uqhpPwGGP2+Tme5Y/ROp7RccvleW8B8M0M+Xl0+n68ln0I38vGNdzvJ4en0fxhmT3Ps938WmDzTva/JYYx/1kdslPEWm5l86uqXvie7Hl44FU3o/m3nnogml9VtcguW2u2nb8nTSfZe8ZwGH72VNX0JDzPXYTzT7Jr+6rKv9PknuSfngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFaUngAAAAAAAAAAgFZm570B8I3c+Il3RfMvfGUZzd/6Dx+O5q/DuMweo6qqP/H6z8fH6O74+d3z3gQA4DtpMpz3Frx869iHxSIaP+4fRPOrqmrIHqfx9DSaX6tVNr8qfp5rmv+tV/pqOLryYHiEqqOHs+c6vaL5xIuPhEeouv3c/dH8Sx/Pv6KbHZ5F8ycn+XcItQzfl87C96RxzOavwbiOfQg/f4b5Gl6Jr/qfa/iG7oF72Tr2YQw/s9ayqkw/Fzfn0fiN2+H1UlXtTrNnYvN2/kwvN7JjHD2UX5P9yXd/NJr//FF2LXDy1SvR/KqqC89m70kvPLgZza+quvXVrWj+Yy/k1zPzG4fR/PS7rjH9DqeqxkV23cq9yT89AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArSg9AQAAAAAAAAAArczOewPgGzm9OETz/9Xf+/lo/p993U9H86uqHn7/k9H86cX7o/lVVT/+0O/Fx+hudkc/FQDWaRzHaP6wisavx5A9RlVVNaYP1DScX7W8+VI0f7K5Gc2vSX4eOh6fRPMnVx6I5ldVLR/NjnH40Bo+q7uLaP7BYfazury7Ec2vqtr9UvYV2sbdXwWp4gAAD5hJREFU/H11nGbfs0xOl9H8qqqae5X5LQ3Ze/cwW8OzYZG9J6WPUVVVTe6FCR/wsqTXMyfZeXRV1TDLPneHZfYYTW7l78XT/d1o/nCWn18dveZSNH/vz+9F86uq/ubV34nm/6Pn3hPNf/CT4blPVR09mF1XTo+ya42qqt0vZ8eY7Z9F86uqhpu3o/mr8Dx6FX6Hsxbh975rMeSvt27HyTfpAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK0pPAAAAAAAAAABAK7Pz3gD4Rq79i09E86//jc1o/m//9D+N5ldV/Znxb0fzH/2dF6P5VVUH40Z4hONwft6wPO8tAIDvLsM0/NuQ1ZjNr6qaDNn8cZXNr6qaTrP5Q/gYVdX0vvui+avDw2j+ZCM9V6+aPPZwNH959VI0v6pq//GdaP7xlWj814RvS8uT7PU8vxW+X1TVNLy0nCzzz4bp8T2wuDxbnPcWvPKt4xkdNqSf0ct74FqAb2YN89y4cQ1rprAxfK9Z7R9E86uqhmX2mTJsbWXzZ/k54uTm3Wj+8tEHovlVVdf/6Dya/wvf92+j+VVVb97Irsl+/6k3RPMfvLSGz+pZ9r46v5v/n5ULz2Xvq7OD/muN8fT0vDeBdbgH5knfaf7pCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaEXpCQAAAAAAAAAAaGV23hsA38jy9p1o/o/92k9G8z/7V/5ZNL+q6sM/80vR/F/6609E86uqnpjfDI+wG87P27gznPcmAMB3lXG5iuYPwxqe7asxP0bcMhs/nWbz1zDGsL0dzV/LMZpkf4u12sjvw8nF8D5s5q/n4Sx7X5rsb0TzZ4f5++rmrex52NjLPnuqqiaL8GdpHc+39Bir8HlYxzGahV/3LhbZ/KqqSfo83wvzJPgmRp/xV4TweRjXcS87Psnmh5+7Y3itUVU1PHo1mn9wLf/9xvztt6L5D033ovlVVT/2pR+M5k+/uBXN3zjIrwXG8PTq8mfC73Cqar6fPU7Tg/A9r/LvHOPGNWy/eQz/H/zTEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0IrSEwAAAAAAAAAA0MrsvDcAzssbfu5/R/P/6g/8sWh+VdUHHv9v0fyfeuCpaP7X7K5hjN5e9UNPR/PPPvr90fyqquVmtmN7cmkaza+quvQbH4/mrw4OovkAfPuGYTjvTXjZxnGM5q/jGI3LVTR/WGWPUVVVzbNL7mFzI5u/tRXNr6paXcyuBxbb+XnikP2o1taL+ettepg9TrOjaHxt3cxfz1t3ltH8+d4iml9VNds/jeYPZ9ljVFU1nGT3oSbh34dO8/ekWuQ/S3HreEbDvSw9Vw+vNfg2rfLP3TE9xpidSE8u3h/Nr6oadzaj+fuP5ucO0yF7Tf/9L/1INL+q6jMffTyaf+3J7Pxq++m9aH5V1biZ/SydXcy/P5jfPYnmT+7kv6MZz8LrmWX+2dDeOt77miutnX96AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWlF6AgAAAAAAAAAAWpmd9wbAeVnt7UXzr/+l10Tzq6q+9y+/L5r/8+/9QDS/quo9OyfxMbr7rTf9x2j+8ldW0fx1mA75Du8PvPfPRfN3/tqVaH5V1eKLT8fHAODbMBnyYyzH/Bhhw5A9TuOYP0bDZJrN35hH88etjWh+VdUYPs/ruN429rPz6dUsP9edHYbzj7L5W7eW2QGqan6wiObP7uTXxtM7B9kBlvnzUIvwGOl9WGQ/R1VVteo/B0hbyxxg6rfGwD0gPVefZtdL8e2vqnGaHWPnRv7d/f5/eSCa/8xmNr+q6sHr2Wf75s3sXH2yH16QVVXdPI3GT29k309UVY372fXM6iB/HtLz0DG9FljDPDruXtgHvo7VFwAAAAAA/J927hg3rioMw/B/7ziYWIqgAkEkKqgiuiAkNoDYABISEjugoqSkgJqGHaTENLTZQAqk0CcpkCKUSIBjgu2Ze7IACqJI/zXf5HkW8J3xaGyfsV8bAACAKKInAAAAAAAAAAAgiugJAAAAAAAAAACIInoCAAAAAAAAAACiiJ4AAAAAAAAAAIAooicAAAAAAAAAACCK6AkAAAAAAAAAAIgiegIAAAAAAAAAAKKIngAAAAAAAAAAgCiiJwAAAAAAAAAAIIroCQAAAAAAAAAAiCJ6AgAAAAAAAAAAooieAAAAAAAAAACAKKInAAAAAAAAAAAgiugJAAAAAAAAAACIInoCAAAAAAAAAACiiJ4AAAAAAAAAAIAooicAAAAAAAAAACCK6AkAAAAAAAAAAIgiegIAAAAAAAAAAKKIngAAAAAAAAAAgCiiJwAAAAAAAAAAIIroCQAAAAAAAAAAiHJw2Q8A9tX23oP2M9757rfW/e9vfdK6X1X11advt+5/+cVx635V1efX7rfuH82vtO5vJv3r87h946fW/a9/fL91v6rqzodHrfvj7Kx1H2BvLKP9iGma2s9It8pztOxa58d56/wqz9HcfMbh6P98Ozi50rt/2vt+oKpqc7a07s/nvZ8L87b38VdVbU5677rT6dPW/aqq8fSf3gO22979Nex6X6tr3AHazfl3DPck9t4K9x9eEs2vpXHRe3dov/tU1fzgYev+649PWverql47erV1f7na+36pqmr+8+/eA/74q3V+WeG1Orrv6t336Koa3Wf4/gmx/KYbAAAAAAAAAACIInoCAAAAAAAAAACiiJ4AAAAAAAAAAIAooicAAAAAAAAAACCK6AkAAAAAAAAAAIgiegIAAAAAAAAAAKKIngAAAAAAAAAAgCiiJwAAAAAAAAAAIIroCQAAAAAAAAAAiCJ6AgAAAAAAAAAAooieAAAAAAAAAACAKKInAAAAAAAAAAAgiugJAAAAAAAAAACIInoCAAAAAAAAAACiiJ4AAAAAAAAAAIAooicAAAAAAAAAACCK6AkAAAAAAAAAAIgiegIAAAAAAAAAAKKIngAAAAAAAAAAgCiiJwAAAAAAAAAAIIroCQAAAAAAAAAAiCJ6AgAAAAAAAAAAooieAAAAAAAAAACAKKInAAAAAAAAAAAgysFlPwDgxY3ttnV/efh7635V1fVv77fuH//wXut+VdXxmx+17t/77I3W/Q8+/rV1v6rqm+s/t+6/tbnaul9VdTF2rfu37t5s3a+qevf8l/YzAPbCPPXuL6N3v2o/PoZ9sOu9P3Tvj4vz1v2qqnrypHV+etT/t14Hm94zrhwetu5XVdUc/jdxze+N1zC2zV8vqvqfp7H07lfV2PWeMU3N3z/5Xxij/x4zTZv2MwDiLb33n+X0tHW/qqq6z3j0uHd/T+zc4f7bCvcfYCW+5v1L+E+1AAAAAAAAAACAl43oCQAAAAAAAAAAiCJ6AgAAAAAAAAAAooieAAAAAAAAAACAKKInAAAAAAAAAAAgiugJAAAAAAAAAACIInoCAAAAAAAAAACiiJ4AAAAAAAAAAIAooicAAAAAAAAAACCK6AkAAAAAAAAAAIgiegIAAAAAAAAAAKKIngAAAAAAAAAAgCiiJwAAAAAAAAAAIIroCQAAAAAAAAAAiCJ6AgAAAAAAAAAAooieAAAAAAAAAACAKKInAAAAAAAAAAAgiugJAAAAAAAAAACIInoCAAAAAAAAAACiiJ4AAAAAAAAAAIAooicAAAAAAAAAACCK6AkAAAAAAAAAAIgiegIAAAAAAAAAAKJMY4zLfgwAAAAAAAAAAADPzX96AgAAAAAAAAAAooieAAAAAAAAAACAKKInAAAAAAAAAAAgiugJAAAAAAAAAACIInoCAAAAAAAAAACiiJ4AAAAAAAAAAIAooicAAAAAAAAAACCK6AkAAAAAAAAAAIgiegIAAAAAAAAAAKKIngAAAAAAAAAAgCiiJwAAAAAAAAAAIIroCQAAAAAAAAAAiCJ6AgAAAAAAAAAAooieAAAAAAAAAACAKKInAAAAAAAAAAAgiugJAAAAAAAAAACIInoCAAAAAAAAAACiiJ4AAAAAAAAAAIAooicAAAAAAAAAACDKM2lE6ueAmpW3AAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 3000x1200 with 3 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "vtsAhXOTE2lR",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}